#include <iostream>

using namespace std;

/*
 * 成员变量和成员函数是分开储存的
 *
 * this是一个指针        this->属性名
 * 可以使用 return *this  来返回对象本体，函数的返回类型为 引用
 *                                    注     此处如果返回对象本体而非引用，则会触发到拷贝构造函数，会重新构造一个新的对象返回，而不是返回原来的对象了
 *                                          所以，链式编程最好返回值类型设置为 引用
 *
 *  c++中空指针可以调用成员函数，但是必须保证没有用到this指针
 */

class Test01{

};

class Test02{
    int a;   // 非静态成员变量 属于类的对象上
    static int b;  // 静态成员变量 不属于类的对象上
    void func() {  // 非静态成员函数 不属于类的对象上

    }
    static void func2() {  // 静态成员函数 不属于类的对象上

    }
};

class Test03{
public:
    int age;
    void test03(){
        cout << "test03" << endl;
    }

    void test04(){
        if(this == NULL) {  // 防止空指针调用下面的age时报错
            return;
        }
        cout << "age= " << age << endl;
    }
};

void test01(){
    Test01 t1;
    // 空对象占用内存空间为1.c++编译器会给每个空对象也分配一个字节空间，为了区分空对象占内存的位置
    // 每个空对象也有一个独一无二的内存地址
    cout << "sizeof t1 = " << sizeof(t1) << endl;
}

void  test02(){
    Test02 t2;
    cout << "sizeof t2 = " << sizeof(t2) << endl;
}

int main() {
    test01();
    test02();

    Test03 * t4 = NULL;
    t4->test03();
    t4->test04();

    return 0;
}
